package base.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternAndMatcher {
    public static void main(String[] args) {
//        p("abc".matches("[a-z]{3}"));
//        //编译好的模式，用起来速度快些
//        Pattern pattern = Pattern.compile("[a-z]{3}");
//        //这个模式匹配某个字符串产生的结果，这个结果可能有多个
//        Matcher m = pattern.matcher("abc");
//        p(m.matches());

        //初步认识. * +
//        p("a".matches("."));
//        p("aa".matches("aa"));
//        p("aaa".matches("a*"));
//        p("aaaa".matches("a+"));
//        p("".matches("a*"));
//        p("aaaa".matches("a?"));
//        p("".matches("a?"));
//        p("a".matches("a?"));
//        p("21464654656545".matches("\\d{3,100}"));
//        p("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}.\\d{1,3}.\\d{1,3}"));
//        p("192".matches("[0-2][0-9][0-9]"));


        //范围
//        p("a".matches("[abc]"));
//        p("a".matches("[^abc]"));
//        p("A".matches("[a-zA-Z]"));
//        p("A".matches("[a-z]|[A-Z]"));
//        p("A".matches("[a-z[A-Z]]"));
//        p("R".matches("[A-Z&&[RFG]]"));
//        p("a".matches("a|b"));


        //认识\s \d \w
//        p(" \n\r\t".matches("\\s{4}"));
//        p(" ".matches("\\S"));
//        p("a_8".matches("\\w{3}"));
//        p("abc888&^%".matches("[a-z]{1,3}\\d+[&^#%]+"));
//        //正则表达式里一个反斜线需要四个反斜线
//        p("\\".matches("\\\\"));


        //POSIX Style
        //p("a".matches("\\p{Lower}"));

        //boundary
//        p("hello sir".matches("^h.*"));
//        p("hello sir".matches(".*ir$"));
        //\b单词边界
//        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
//        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
//        p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));

        //exam
//        p("aaa 8888c".matches(".*\\d{4}."));
//        p("aaa 8888c".matches(".*\\b\\d{4}."));
//        p("aaa8888c".matches(".*\\d{4}."));
//        p("aaa8888c".matches(".*\\b\\d{4}."));

        //匹配eamil的正则表达式
//        p("hjn163@163.com".matches("^[a-zA-Z].*@[a-zA-Z0-9]\\.[a-zA-Z]"));
//        p("hjn163@163.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));


        //matches find lookingAt
//        Pattern p = Pattern.compile("\\d{3,5}");
//        String s = "123-34345-234-00";
//        Matcher m = p.matcher(s);
//        p(m.matches());
//        //恢复到初始状态
//        m.reset();
//
//        p(m.find());
//        p(m.start()+"-"+m.end());
//        p(m.find());
//        p(m.start()+"-"+m.end());
//        p(m.find());
//        p(m.start()+"-"+m.end());
//        p(m.find());
//       // p(m.start()+"-"+m.end());
//
//        //从头开始找
//        p(m.lookingAt());


        //replacement
//        Pattern p = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
//        Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava");
//        p(m.replaceAll("JAVA"));



        //day2
        //group
        Pattern pattern = Pattern.compile("(\\d{3,5})([a-z]{2})");
        String s = "00-123aa-34345bb-234cc-00";
        Matcher m = pattern.matcher(s);
        while(m.find()){
            p(m.group());
        }

        //non-capturing groups
        //符合条件就捕获，不符合条件就不捕获，放在后面不包含，放在前面包含
//        Pattern pattern = Pattern.compile(".{3}(?=a)");
//        Pattern pattern1 = Pattern.compile("(?=a).{3}");
//        String s = "444a66b";
//        Matcher m = pattern.matcher(s);
//        while(m.find()){
//            p(m.group());
//        }


//        Pattern pattern = Pattern.compile(".{3}(?!a)");
//        Pattern pattern1 = Pattern.compile("(?!a).{3}");
//        String s = "444a66b";
//        Matcher m = pattern.matcher(s);
//        while(m.find()){
//            p(m.group());
//        }

        //用的非常少
//        Pattern pattern = Pattern.compile(".{3}(?<!a)");
//        Pattern pattern1 = Pattern.compile("(?!a).{3}");
//        String s = "444a66b";
//        Matcher m = pattern.matcher(s);
//        while(m.find()){
//            p(m.group());
//        }





    }
    public static void p(Object o) {
        System.out.println(o);
    }
}
